#ifndef PUBLICSTRUCT_H
#define PUBLICSTRUCT_H
#include <QString>
#include <QList>
#include <QPixmap>
#include <QLabel>
#include <QPainter>
#include <opencv2/opencv.hpp>
using namespace cv;

#define SRV_ADDR "192.168.10.128"
#define SRV_PORT 45545
#define PATH_IMG QString("http://%1:8080/img").arg(SRV_ADDR)    // 图像资源
#define PATH_JOY QString("http://%1:8080/joy").arg(SRV_ADDR)    // 表情资源路径
#define PATH_FILE QString("http://%1:8080/file").arg(SRV_ADDR)    // 文件资源路径
#define SRV_HOSTNAME "baolong@192.168.10.128"                   // 服务器主机名

//个人资料
struct st_personData{
    int dd_num;     // DD号
    QString pwd;    // 密码
    QString nick;   // 昵称
    QString sex;    // 性别
    QString phone;  // 手机号
    QString email;  // 电子邮箱
    QString city;   // 故乡
    QString gxqm;   // 个性签名
    QString birthday;   // 生日
    int status;     // 状态 0 离线 1 在线

};

//好友资料
struct st_friendData{
    st_friendData(){}
    st_friendData(int uid,const QString& _nick,const QString& _sex):
        dd_num(uid),nick(_nick),sex(_sex){status = 0;}
    st_friendData(int uid,const QString& _nick,const QString& _sex,int _status):
        dd_num(uid),nick(_nick),sex(_sex),status(_status){}
    int dd_num;     //DD号
    QString nick;   //昵称
    QString sex;    //性别
    QString phone;  // 手机号
    QString email;  // 电子邮箱
    QString city;   // 故乡
    QString gxqm;   // 个性签名
    QString birthday;   // 生日
    int status;     //好友状态, 0 离线 1 在线
};

// 群成员信息结构体
struct st_gMemberData{
    int mid;            // 用户id
    QString nick;       // 昵称
};

// 群聊信息结构体
struct st_gData{
    int gid;                        // 群ID
    QString gname;                  // 群名称
    int gboss;                      // 群主
    QString gintroduce;             // 群介绍
};

// 用户信息结构体
struct st_userInfo{
    st_personData sdata;                // 个人资料
    QList<st_friendData> friend_list;   // 好友列表
    QList<st_gData> group_list;         // 群聊列表
};

// 搜索好友查询结果结构体
struct st_searchUserResult{
    int res;                            // 查询结果 0 无结果 1有结果
    QList<st_friendData> friend_list;   // 查询的好友结果集
};

// 搜索群聊查询结果结构体
struct st_searchGroupResult{
    int res;                            // 查询结果 0 无结果 1有结果
    QList<st_gData> group_list;         // 查询的群聊结果集
};

// 通知结构体
struct st_notice{
    st_notice(){}
    st_notice(int _type,struct st_friendData _fdata,int _result):type(_type),fdata(_fdata),result(_result){}
    st_notice(int _type,struct st_friendData _fdata):type(_type),fdata(_fdata){}
    st_notice(int _type,struct st_gData _gdata):type(_type),gdata(_gdata){}
    st_notice(int _type):type(_type){}
    int type;                           // 通知类型
    struct st_friendData fdata;         // 好友个人资料
    struct st_gData gdata;              // 群资料
    int result;                         // 添加好友/群的处理结果  0 拒绝  1 同意
};
// 通知类型枚举
enum NoticeType{
  ADD_FRIEND_REQUEST,                   // 添加好友请求
  ADD_FRIEND_RESULT,                    // 添加好友处理结果
  DELETE_FRIEND_NOTICE,                 // 删除好友通知
  DISSOLVE_GROUP_NOTICE,                // 解散群聊通知
  WELCOME,                                // 欢迎通知
  NEW_GROUP_NOTICE                      // 新群聊创建通知
};

// TreeWidgetItem列表项结构体
struct st_treeItem{
    st_treeItem(){}
    st_treeItem(struct st_friendData data,int _type):fdata(data),type(_type){}
    st_treeItem(struct st_gData data,int _type):gdata(data),type(_type){}
    struct st_friendData fdata;         // 好友个人资料
    struct st_gData gdata;              // 群资料
    int type;                           // Item类型  (好友/群)
};

// Item类型枚举
enum TreeItemType{
    TI_FRIEND,  // 好友
    TI_GROUP    // 群
};

// 聊天记录类型
enum RecordType{
    R_USER,     // 用户
    R_FRIEND,    // 好友
    R_NOTICE     // 通知
};

//消息结构体
struct st_msg{
    int send;           // 发送方
    int recv;           // 接收方
    int type;           // 消息类型
    QString contect;    // 消息内容(文本)
    QString sendtime;     // 发送时间 1970-01-01 00:00:00 到现在的秒数
};

// 动态结构体
struct st_feed{
    int announcer;      // 发布者ID
    QString nick;       // 发布者昵称
    int pyqtype;        // 动态类型
    QString content;    // 动态内容
    QString sendtime;   // 发送时间
    QString feedID;     // 动态唯一标识
};

// 点赞评论结构体
struct st_dzpl{
    int uid;            // 评论者ID
    QString nick;       // 评论者昵称
    QString feedID;     // 评论的动态
    int type;           // 1-点赞 2-评论
    QString content;    // 评论内容
    QString optime;     // 此操作时间
    QString opID;       // 操作唯一标识符
};

// 群文件结构体
struct st_file
{
    QString fid;     // 文件唯一标识
    QString fname;   // 文件名
    long fsize;     // 文件大小
    QString fpath;   // 文件路径
    int gid;        // 所属群组
    int uid;        // 上传者
    QString nick;   // 上传者昵称
    QString upload_time; // 上传时间
};

// 群公告结构体
struct st_gNotice
{
    int uid;         // 上传者
    int gid;         // 所属群组
    QString content;  // 公告内容
    QString sendtime; // 发布时间
};

// 从url地址下载图片,并返回
QPixmap downLoadFromUrl(const QString& url);

// 从url地址下载图片,保存到本地
void downLoadSaveFromUrl(const QString& url,const QString local);

// 将图像裁剪成圆形的Pixmap,并绘制到QLabel上
QPixmap tailorCirclePixmap(const QPixmap t_pixmap,QLabel* label);

// 将图像裁剪成圆形
QPixmap PixmapToRound(const QPixmap &src, int radius);

// 设置qss样式
void setQssStyle(const QString& qss,QWidget* widget);

// 创建圆形图标头像(OpenCV)
QPixmap PixmapToRoundOpenCV(const QPixmap &src);

// 创建带边框的圆形头像(OpenCV)
QPixmap RoundBorderPixmap(const QPixmap &originalPixmap, int borderWidth, const cv::Scalar &borderColor);


#endif // PUBLICSTRUCT_H
